// 反转字符串 II
/*给定一个字符串 s 和一个整数 k，从字符串开头算起，每计数至 2k 个字符，就反转这 2k 字符中的前 k 个字符。

如果剩余字符少于 k 个，则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样。

1 <= s.length <= 104
s 仅由小写英文组成
1 <= k <= 104
*/
class Solution {
public:
    void reverse_str(string& s, int left, int right) {
        while (left < right) {
            swap(s[left], s[right]);
            left++;
            right--;
        }
    }
    string reverseStr(string s, int k) {
        int size = s.size();
        int left = 0;
        int right = k - 1;
        while (left + 2 * k <= size) {
            reverse_str(s, left, right);
            left += 2 * k;
            right += 2 * k;
        }
        if (left + k >= size) {
            reverse(s.begin() + left, s.end());
        } else if (left + k < size) {
            reverse_str(s, left, right);
        }
        return s;
    }
};




//反转字符串中的单词 III
/*给定一个字符串 s ，你需要反转字符串中每个单词的字符顺序，同时仍保留空格和单词的初始顺序。
1 <= s.length <= 5 * 104
s 包含可打印的 ASCII 字符。
s 不包含任何开头或结尾空格。
s 里 至少 有一个词。
s 中的所有单词都用一个空格隔开。
*/
class Solution {
public:
    void reverse_str(string& s, int left, int right) {
        while (left < right) {
            swap(s[left], s[right]);
            left++;
            right--;
        }
    }
    string reverseWords(string s) {
        int slow = 0,quick = 0;
        int size = s.size();
        while (quick < size) {
            if (s[quick] == ' ') {
                reverse_str(s, slow, quick - 1);
                quick++;
                slow = quick;
            } else if (quick == size - 1) {
                reverse_str(s, slow, quick);
            }
            quick++;
        }
        return s;
    }
};


